package com.yue.mytest.za;

import org.junit.Test;

import java.math.BigDecimal;
import java.util.Collections;
import java.util.List;

/**
 * Created by qiuyang on 15/02/2017.
 *
 * http://www.importnew.com/7268.html
 */
public class TestNullPointerException {

    /**
     * 从已知的String对象中调用equals()和equalsIgnoreCase()方法，而非未知对象。
     * 总是从已知的非空String对象中调用equals()方法。因为equals()方法是对称的，调用a.equals(b)和调用b.equals(a)是完全相同的，这也是为什么程序员对于对象a和b这么不上心。如果调用者是空指针，这种调用可能导致一个空指针异常
     */
    @Test
    public void test1() {
        Object unknownObject = null;

        //错误方式 – 可能导致 NullPointerException
//        if (unknownObject.equals("knownObject")) {
//            System.err.println("This may result in NullPointerException if unknownObject is null");
//        }

        //正确方式 - 即便 unknownObject是null也能避免NullPointerException
        if ("knownObject".equals(unknownObject)) {
            System.err.println("better coding avoided NullPointerException");
        }
    }

    /**
     * 当valueOf()和toString()返回相同的结果时，宁愿使用前者。
     * 因为调用null对象的toString()会抛出空指针异常，如果我们能够使用valueOf()获得相同的值，那宁愿使用valueOf()，传递一个null给valueOf()将会返回“null”，尤其是在那些包装类，像Integer、Float、Double和BigDecimal。
     */
    @Test
    public void test2(){
        BigDecimal bd = null;
        System.out.println(String.valueOf(bd)); //不会抛出空指针异常
        System.out.println(bd.toString()); //抛出 "Exception in thread "main" java.lang.NullPointerException"
    }

    /**
     *  使用null安全的方法和库
     *  有很多开源库已经为您做了繁重的空指针检查工作。其中最常用的一个的是Apache commons 中的StringUtils。你可以使用StringUtils.isBlank()，isNumeric()，isWhiteSpace()以及其他的工具方法而不用担心空指针异常。
     */
    @Test
    public void test3(){

    }

    /**
     *  避免从方法中返回空指针，而是返回空collection或者空数组
     */
    @Test
    public void test4(){
        List l = Collections.EMPTY_LIST;
    }
}
